home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 1.iso
/
DEMON
/
RISCOS2
/
TCP_131S.ARC
/
c
/
TRACE
< prev
next >
Wrap
Text File
|
1994-03-03
|
4KB
|
165 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include "global.h"
#include "mbuf.h"
#include "iface.h"
#include "trace.h"
#include "session.h"
#include "misc.h"
static void ctohex(char *, int16);
/* Redefined here so that programs calling dump in the library won't pull
* in the rest of the package
*/
static char nospace[] = "No space!!\n";
void dump(register struct interface *interface, int direction,
unsigned type, struct mbuf *bp)
{
struct mbuf *tbp;
void (*func)();
int16 size;
time_t t;
struct tm *tm;
if((interface->trace & direction) == 0)
return; /* Nothing to trace */
time(&t);
tm = localtime(&t);
switch(direction){
case IF_TRACE_IN:
twprintf("%02d:%02d:%02d %s recv:\n",tm->tm_hour,tm->tm_min,tm->tm_sec,interface->name);
break;
case IF_TRACE_OUT:
twprintf("%02d:%02d:%02d %s sent:\n",tm->tm_hour,tm->tm_min,tm->tm_sec,interface->name);
break;
}
if(bp == NULLBUF || (size = len_mbuf(bp)) == 0){
twprintf("empty packet!!\n");
return;
}
if(type < NTRACE)
func = tracef[type];
else
func = NULLVFP;
dup_p(&tbp,bp,0,size);
if(tbp == NULLBUF){
twprintf(nospace);
return;
}
if(func != NULLVFP)
(*func)(&tbp,1);
if(interface->trace & IF_TRACE_ASCII){
/* Dump only data portion of packet in ascii */
ascii_dump(&tbp);
} else if(interface->trace & IF_TRACE_HEX){
/* Dump entire packet in hex/ascii */
free_p(tbp);
dup_p(&tbp,bp,0,len_mbuf(bp));
if(tbp != NULLBUF)
hex_dump(&tbp);
else
twprintf(nospace);
}
free_p(tbp);
}
/* Dump an mbuf in hex */
void hex_dump(register struct mbuf **bpp)
{
int16 n;
int16 address;
char buf[16];
if(bpp == NULLBUFP || *bpp == NULLBUF)
return;
address = 0;
while((n = pullup(bpp,buf,sizeof(buf))) != 0){
fmtline(address,buf,n);
address += n;
}
}
/* Dump an mbuf in ascii */
void ascii_dump(register struct mbuf **bpp)
{
char Buffer[10];
char c;
register int16 tot;
char *line;
if(bpp == NULLBUFP || *bpp == NULLBUF)
return;
line = malloc(2000);
*line = '\0';
tot = 0;
while(pullone(bpp,&c) == 1)
{
if((tot % 64) == 0)
{
sprintf(Buffer, "%04x ",tot);
strcat(line, Buffer);
}
if (isprint(c)) {
sprintf(Buffer, "%c", c);
strcat(line, Buffer);
} else {
strcat(line, ".");
}
if((++tot % 64) == 0)
strcat(line, "\n");
}
if((tot % 64) != 0)
strcat(line, "\n");
twputs(line);
free(line);
}
/* Print a buffer up to 16 bytes long in formatted hex with ascii
* translation, e.g.,
* 0000: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 0123456789:;<=>?
*/
void fmtline(int16 addr, char *buf, int16 len)
{
char line[80];
register char *aptr,*cptr;
register char c;
memset(line,' ',sizeof(line));
ctohex(line,hibyte(addr));
ctohex(line+2,lobyte(addr));
aptr = &line[6];
cptr = &line[55];
while(len-- != 0){
c = *buf++;
ctohex(aptr,(int16)uchar(c));
aptr += 3;
c &= 0x7f;
*cptr++ = isprint(c) ? c : '.';
}
*cptr++ = '\r';
*cptr++ = '\n';
*cptr = '\0';
twputs(line);
}
/* Convert byte to two ascii-hex characters */
static void ctohex(register char *buf, register int16 c)
{
static char hex[] = "0123456789abcdef";
*buf++ = hex[hinibble(c)];
*buf = hex[lonibble(c)];
}